package com.ssy.lingxi.member.merchant.serviceimpl.feign;

import com.ssy.lingxi.common.response.ResponseCode;
import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.member.merchant.service.feign.ISmsFeignService;
import com.ssy.lingxi.sms.api.common.SmsTemplateEnum;
import com.ssy.lingxi.sms.api.entity.SmsSendMsg;
import com.ssy.lingxi.sms.api.feign.ISendSmsFeign;
import com.ssy.lingxi.sms.api.model.SmsVO;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;

import javax.annotation.Resource;
import java.util.List;

/**
 * 调用短信服务Feign接口实现类
 * @author 万宁
 * @version 2.0.0
 * @date 2020-09-09
 */
@Service
public class SmsFeignServiceImpl implements ISmsFeignService {

    /**
     * 短信服务提供的Feign接口
     */
    @Resource
    private ISendSmsFeign sendSmsFeign;

    /**
     * 腾讯短信需要在手机号码前加上“+86”的前缀
     */
    private final String SmsPrefix = "+86";


    /**
     * 发送会员注册时的短信验证码
     *
     * @param countryCode   国家代码
     * @param phone         手机号码
     * @param smsCode       短信验证码
     * @param expireMinutes 验证码有效时间（分钟）
     * @return 发送结果
     */
    @Override
    public Wrapper<Void> sendRegisterSms(String countryCode, String phone, String smsCode, Integer expireMinutes) {
        return sendSmsViaFeign(countryCode + phone, SmsTemplateEnum.Register.getCode(), smsCode, expireMinutes);
    }

    /**
     * 发送通过手机号重设密码时的短信验证码
     *
     * @param countryCode   国家代码
     * @param phone         手机号码
     * @param smsCode       短信验证码
     * @param expireMinutes 验证码有效时间（分钟）
     * @return 发送结果
     */
    @Override
    public Wrapper<Void> sendResetPasswordSms(String countryCode, String phone, String smsCode, Integer expireMinutes) {
        return sendSmsViaFeign(countryCode + phone, SmsTemplateEnum.UpdatePwd.getCode(), smsCode, expireMinutes);
    }

    /**
     * 发送更改密码短信
     * @param countryCode 国家代码
     * @param phone 手机号码
     * @param smsCode 短信验证码
     * @param expireMinutes 短信有效时间（分钟）
     * @return 发送结果
     */
    @Override
    public Wrapper<Void> sendChangePasswordSms(String countryCode, String phone, String smsCode, Integer expireMinutes) {
        return sendSmsViaFeign(SmsPrefix + phone, SmsTemplateEnum.UpdatePwd.getCode(), smsCode, expireMinutes);
    }

    /**
     * 发送更改邮箱短信
     * @param countryCode 国家代码
     * @param phone 手机号码
     * @param smsCode 短信验证码
     * @param expireMinutes 短信有效时间（分钟）
     * @return 发送结果
     */
    @Override
    public Wrapper<Void> sendChangeEmailSms(String countryCode, String phone, String smsCode, Integer expireMinutes) {
        return sendSmsViaFeign(SmsPrefix + phone, SmsTemplateEnum.UpdateEmail.getCode(), smsCode, expireMinutes);
    }

    /**
     * 发送更改手机号码短信
     * @param countryCode 国家代码
     * @param phone 手机号码
     * @param smsCode 短信验证码
     * @param expireMinutes 短信有效时间（分钟）
     * @return 发送结果
     */
    @Override
    public Wrapper<Void> sendChangePhoneSms(String countryCode, String phone, String smsCode, Integer expireMinutes) {
        return sendSmsViaFeign(SmsPrefix + phone, SmsTemplateEnum.UpdatePhone.getCode(), smsCode, expireMinutes);
    }

    /**
     * 发送更改支付密码短信
     * @param countryCode 国家代码
     * @param phone 手机号码
     * @param smsCode 短信验证码
     * @param expireMinutes 短信有效时间（分钟）
     * @return 发送结果
     */
    @Override
    public Wrapper<Void> sendChangePayPasswordSms(String countryCode, String phone, String smsCode, Integer expireMinutes) {
        return sendSmsViaFeign(SmsPrefix + phone, SmsTemplateEnum.UpdatePayPwd.getCode(), smsCode, expireMinutes);
    }

    /**
     * 发送App手机号登录的短信
     *
     * @param countryCode   国家代码
     * @param phone         手机号码
     * @param smsCode       短信验证码
     * @param expireMinutes 短信有效时间（分钟）
     * @return 发送结果
     */
    @Override
    public Wrapper<Void> sendMobilePhoneLoginSms(String countryCode, String phone, String smsCode, Integer expireMinutes) {
        return sendSmsViaFeign(countryCode + phone, SmsTemplateEnum.Login.getCode(), smsCode, expireMinutes);
    }

    /**
     * 发送短信
     * @param phone 手机号码
     * @param templateCode 短信模板编码
     * @param smsCode 短信验证码
     * @return 发送结果
     */
    private Wrapper<Void> sendSmsViaFeign(String phone, String templateCode,  String smsCode, Integer expireMinutes) {
        SmsVO smsVO = new SmsVO();
        String[] phones = new String[1];
        phones[0] = phone;
        String[] param = new String[2];
        param[0] = smsCode;
        param[1] = String.valueOf(expireMinutes);

        smsVO.setPhones(phones);
        //短信类型（模板）
        smsVO.setCode(templateCode);
        smsVO.setTemplateParam(param);
        Wrapper<List<SmsSendMsg>> result = sendSmsFeign.sendSms(smsVO);
        if(result.getCode() != ResponseCode.SUCCESS.getCode()) {
            return Wrapper.fail(result.getCode(), result.getMessage());
        }

        if(!CollectionUtils.isEmpty(result.getData())) {
            SmsSendMsg msgResult = result.getData().stream().filter(s -> s.getPhone().equals(phone)).findFirst().orElse(null);
            if(msgResult != null && (msgResult.getStatus() == null || !msgResult.getStatus())) {
                return Wrapper.fail(ResponseCode.SERVICE_SMS_ERROR, StringUtils.hasLength(msgResult.getMsg()) ? msgResult.getMsg() : "");
            }
        }

        return Wrapper.success();
    }
}
